import * as _ from './utils/underscore';

// 函数记忆

// 函数记忆是指将上次的计算结果缓存起来，下次调用时，遇到相同的参数，直接返回缓存中的数据。

// 第一版
// function memoize (fn) {
//   var cache = {};
//   return function () {
//     var key = arguments.length + Array.prototype.join.call(arguments, ',');
//     if (key in cache) {
//       return cache[key];
//     } else {
//       return cache[key] = fn.apply(this, arguments);
//     }
//   }
// }

// var add = function (a, b, c) {
//   return a + b + c;
// }

// var memoizedAdd = memoize(add);

// console.time('use memoize');
// for (var i = 0; i < 1000; i++) {
//   memoizedAdd(1, 2, 3);
// }
// console.timeEnd('use memoize');

// console.time('not use memoize');
// for (var i = 0; i < 1000; i++) {
//   add(1, 2, 3);
// }
// console.timeEnd('not use memoize');

// 第二版 underscore
var memoize = function (func, hasher) {
  var memoize = function (key) {
    var cache = memoize.cache;
    var address = '' + (hasher ? hasher.apply(this, key) : key);

    if (!cache[address]) {
      cache[address] = func.apply(this, arguments);
    }
    return cache[address];
  };
  memoize.cache = {};
  return memoize;
}

